﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Plazos
{
    class Curso : CursoBD
    {
        double por;

        public Curso() { 
        }

        public Curso(int sic,int idSem, int horas, int dias, int horasxdia, String fechaInicioLect, String fechaTermLect, String modificar, String colocar ,String fechaInicioPractica , String fechaPractica  , String insOcular, String relatores, String supervision50 , String encuesta75, String publicar, String correrLista, String visitaInfraestructura, String acuerdoOperativo , String f1, String f1C, String ingresoSence, String f2, String f2C, String f3, String seguimiento, String ingSeguimiento1, String ingSeguimiento2, String f4, String certificado,  String entreCertif)
        {
            base.sic = sic;
            base.idSem = idSem;
            base.horas = horas;
            base.dias = dias;
            base.horasxdia = horasxdia;
            base.fechaInicioLect = fechaInicioLect;
            base.fechaTermLect = fechaTermLect;
            base.modificar = modificar;
            base.colocar = colocar;
            base.fechaInicioPractica = fechaInicioPractica;
            base.fechaPractica = fechaPractica;
            base.insOcular = insOcular;
            base.relatores = relatores;
            base.supervision50 = supervision50;
            base.encuesta75 = encuesta75;
            base.publicar = publicar;
            base.correrLista = correrLista;
            base.visitaInfraestructura = visitaInfraestructura;
            base.acuerdoOperativo = acuerdoOperativo;
            base.f1 = f1;
            base.f1C = f1C;
            base.ingresoSence = ingresoSence;
            base.f2 = f2;
            base.f2C = f2C;
            base.f3 = f3;
            base.seguimiento = seguimiento;
            base.ingSeguimiento1 = ingSeguimiento1;
            base.ingSeguimiento2 = ingSeguimiento2;
            base.f4 = f4;
            base.certificado = certificado; // ceremonia
            base.entreCertif = entreCertif;

            
            
   
        }


        String nivelacion;
        public String Nivelacion {
            set { this.nivelacion = value; }
            get { return this.nivelacion; }
        }


        public int Sic
        {
            set { this.sic= value;}
            get { return this.sic; } 
            
        }

        public int IdSem
        {
            set { this.idSem = value; }
            get { return this.idSem; }

        }

        public int Horas
        {
            set { this.horas = value; }
            get { return this.horas; }

        }
        public int Dias
        {
            set { this.dias = value; }
            get { return this.dias; }

        }

        public int Horasxdia
        {
            set { this.horasxdia = value; }
            get { return this.horasxdia; }

        }
        
        public string FechaInicioLect
        {
            set { this.fechaInicioLect = value; }
            get { return this.fechaInicioLect; }
        
        }

        public string FechaTermLect {
            set { this.fechaTermLect = value; }
            get {return this.fechaTermLect;}
        }

        public string Modificar
        {
            set { this.modificar = value; }
            get { return this.modificar; }
        }

        public string Colocar
        {
            set { this.colocar = value; }
            get { return this.colocar; }
        }

        public string FechaInicioPractica
        {
            set { this.fechaInicioPractica = value; }
            get { return this.fechaInicioPractica; }
        }

        public string FechaPractica
        {
            set { this.fechaPractica = value; }
            get { return this.fechaPractica; }
        }

        
        
        public string InsOcular
        {
            get { return insOcular; }
            set { insOcular = value; }
        }
        
        public string Relatores
        {
            get { return relatores; }
            set { relatores = value; }
        }
        
                
        public string Supervision50
        {
            get { return supervision50; }
            set { supervision50 = value; }
        }
        
        public string Encuesta75
        {
            get { return encuesta75; }
            set { encuesta75 = value; }
        }
        
        public string Publicar
        {
            get { return publicar; }
            set { publicar = value; }
        }
        
        public string CorrerLista
        {
            get { return correrLista; }
            set { correrLista = value; }
        }
        
        public string VisitaInfraestructura
        {
            get { return visitaInfraestructura; }
            set { visitaInfraestructura = value; }
        }
        
        public string AcuerdoOperativo
        {
            get { return acuerdoOperativo; }
            set { acuerdoOperativo = value; }
        }
        
        public string F1
        {
            get { return f1; }
            set { f1 = value; }
        }
        
        public string F1C
        {
            get { return f1C; }
            set { f1C = value; }
        }
        
        public string IngresoSence
        {
            get { return ingresoSence; }
            set { ingresoSence = value; }
        }
        
        public string F2
        {
            get { return f2; }
            set { f2 = value; }
        }
        
        public string F2C
        {
            get { return f2C; }
            set { f2C = value; }
        }
        
        public string F3
        {
            get { return f3; }
            set { f3 = value; }
        }
        
        public string Seguimiento
        {
            get { return seguimiento; }
            set { seguimiento = value; }
        }
        
        public string IngSeguimiento1
        {
            get { return ingSeguimiento1; }
            set { ingSeguimiento1 = value; }
        }

        
        public string IngSeguimiento2
        {
            get { return ingSeguimiento2; }
            set { ingSeguimiento2 = value; }
        }

        
        public string F4
        {
            get { return f4; }
            set { f4 = value; }
        }
        
        public string Certificado
        {
            get { return certificado; }
            set { certificado = value; }
        }
        
        public string EntreCertif // fecha en la que se debe entregar el certificado a los alumnos
        {
            get { return entreCertif; }
            set { entreCertif = value; }
        }

        public string Error
        {
            get { return error; }
            set { error = value; }
        }

        public void calcularFechas()
        {
            Feriados fe = new Feriados();
            List<String> fer = fe.rescataFeriados();
            Semestre s = new Semestre();
            Semestre se = new Semestre();
            s= se.calculaSemestre(fechaInicioLect);
            string f;

            Console.WriteLine("id semestre" + s.IdSem);
         
            f = s.FechaConvenio;
            
            
            Console.WriteLine("fecha de convenio que recibe la clase Curso :    " + f);
            Console.WriteLine(" fecha de inicio " + fechaInicioLect + "dias que le agrego " +dias );
            //fechaTermLect = sumaDiaHabil(fechaInicioLect, dias, fer);
            
            Console.WriteLine("fecha en que queda el termino del curso "+ fechaTermLect);
            Console.WriteLine("Calculo de dias "+ dias);
            Console.WriteLine("comenzará a calcular las fechas");
            insOcular = sumaDiaHabil(fechaInicioLect, 11, fer);
            Console.WriteLine("insOcular: " + insOcular);
            relatores = restaDiaHabil(fechaInicioLect, 8, fer);
            Console.WriteLine("relatores: " + relatores);
            supervision50 = calcularPorPorcentaje(supervision50, 0.5, fer);
            Console.WriteLine("supervision50: ", supervision50);
            encuesta75 = calcularPorPorcentaje(encuesta75, 0.75, fer);
            Console.WriteLine("encuesta75: " + encuesta75);
            publicar = sumaDiaHabil(f, 11, fer); // usar la fecha de convenio 
            Console.WriteLine("publicar: " + publicar);
            correrLista = calcularPorPorcentaje(correrLista, 0.2, fer);
            Console.WriteLine("correrLista: " + correrLista);
            visitaInfraestructura = restaDiaHabil(fechaInicioLect, 10, fer);
            Console.WriteLine("visitaInfraestructura: " + visitaInfraestructura);
            acuerdoOperativo = restaDiaHabil(fechaInicioLect, 3, fer);
            Console.WriteLine("acuerdoOperativo: " + acuerdoOperativo);
            f1 = restaDiaHabil(fechaInicioLect, 3, fer);
            Console.WriteLine("f1 : " + f1);
            f1C = calcularPorPorcentaje(f1C, 0.2, fer);
            Console.WriteLine("f1C"+ f1C);
            ingresoSence = sumaDiaHabil(fechaTermLect,4,fer);
            Console.WriteLine("ingresoSence: " + ingresoSence);
            f2 = sumaDiaHabil(fechaTermLect,16, fer); // esto no es así, lo hace para rellenar datos, en el form lo calcula bien
            Console.WriteLine("f2: " + f2);
            f2C =sumaDiaHabil(f2,11,fer);
            Console.WriteLine("f2C: " + f2C);
            Console.WriteLine("fecha Practica : " + fechaPractica);
            f3= sumaDiaHabil(fechaPractica,4, fer);
            Console.WriteLine("f3: " + f3);
            seguimiento = sumaDiaHabil(fechaPractica ,16, fer);
            Console.WriteLine("seguimiento: " + seguimiento);
            ingSeguimiento1 = fechaPractica;
            Console.WriteLine("ingSeguimiento1: " + ingSeguimiento1);
            ingSeguimiento2 = sumaDiaHabil(seguimiento,11, fer);
            Console.WriteLine("ingSeguimiento2: " + ingSeguimiento2);
            f4 = sumaDiaHabil(auxf4(fechaPractica), 4, fer);
            Console.WriteLine("f4: " + f4);
            certificado = sumaDiaHabil(fechaPractica, 11, fer);  // preguntar bien si "plan formativo termina en la practica o termina despues del seguimiento "
            Console.WriteLine("certificado: " + certificado);
            entreCertif = sumaDiaHabil(certificado, 11, fer);
            Console.WriteLine("entreCertif: " + entreCertif);
            Console.WriteLine("AL FINAL DE CALCULAR FECHAS ");
            colocar = sumaDiaHabil(fechaTermLect, 16, fer);

            
        }



        public string sumaDiaHabil(String fecha, int dias, List<String> lista)
        {

            int  cont;
            DateTime dia = Convert.ToDateTime(fecha);
            DateTime ins = dia;
            cont = 1;
            do
            {
                dia = dia.AddDays(1);
                if (((int)dia.DayOfWeek != 0) && ((int)dia.DayOfWeek != 6) )
                {
                    if (esHabil(dia, lista))
                    {
                        ins = dia;
                        cont++;
                       
                    }
                }

            } while (cont < dias);
            
            
            fecha = Convert.ToString(ins);
            fecha = fecha.Substring(0,10);
            
            return fecha;
        }
        public string restaDiaHabil(string fecha, int dias, List<String> lista)
        {

            int  cont;
            DateTime dia = Convert.ToDateTime(fecha);
           // Console.WriteLine((int)dia.DayOfWeek);
            DateTime ins = dia;
            cont = 0;
            do
            {
                dia = dia.AddDays(-1);
                if (((int)dia.DayOfWeek != 0) && ((int)dia.DayOfWeek != 6))
                {
                    if (esHabil(dia, lista))
                    {
                        ins = dia;
                        cont++;
                    }
                }

            } while (cont < dias);
            fecha = Convert.ToString(ins);
            fecha = fecha.Substring(0,10);
            return fecha;
        }

        public string calcularPorPorcentaje(string fecha, double porcentaje, List<String> lista)
        {

            
           double cont=0;
           
            DateTime dia = Convert.ToDateTime(fechaTermLect);
            DateTime  ret;
            ret = dia;
            do{
                dia= dia.AddDays(-1);
                
                if (((int)dia.DayOfWeek != 0) && ((int)dia.DayOfWeek != 6)) // si es que no es sabado o domingo
                {
                    if (esHabil(dia, lista))
                    {
                        cont++;
                    }
                    
                }

            }while(dia!= Convert.ToDateTime(fechaInicioLect) );

            
            double sumar= cont * porcentaje;
            //sumar = sumar - 1;
            dia = Convert.ToDateTime(fechaInicioLect);
           
            //
            do
            {
               
                dia= dia.AddDays(1);
                
                if (((int)dia.DayOfWeek != 0) && ((int)dia.DayOfWeek != 6))
                {
                    ret = dia;
                    sumar = sumar - 1;
                }

            } while (sumar > 0);
            
            fecha = Convert.ToString(ret);
            fecha = fecha.Substring(0,10);
            return fecha;
        }

        public string auxf4 (string fecha )
        {
            DateTime f = Convert.ToDateTime(fecha);
            f = f.AddMonths(3);
            return Convert.ToString(f);
        }

        public Boolean guardarEnBD()
        {
            return true;
        }

        public Boolean esHabil(DateTime dia, List<String > fer) {

            string fecha;
            fecha = Convert.ToString(dia);
            fecha = fecha.Substring(0, 10);
            
            
            foreach (String f in fer)
            {
                if (f == fecha) {
                    Console.WriteLine("feriado en es habil" + fecha);
                    return false;
                }
            }
            return true;
                    
        }

      /*  public List<String> ordenarDescribir() {

            
            CursoBD cu = new CursoBD();
            List<Curso> cur = cu.getCursos();
            List<String> ordenar = new List<String>();
            foreach (Curso c in cur) {
                ordenar.Add(c.insOcular);
            }
            return ordenar;
        }*/

        public int porc(String inicio, String correr) {
            DateTime dia = Convert.ToDateTime(inicio);
            Feriados fe = new Feriados();
            List<String> fer = fe.rescataFeriados();
            DateTime ins = dia;
            int cont;
            cont = 1;
            do
            {
                dia = dia.AddDays(1);
                if (((int)dia.DayOfWeek != 0) && ((int)dia.DayOfWeek != 6))
                {
                    if (esHabil(dia, fer))
                    {
                        ins = dia;
                        cont++;

                    }
                }

            } while (dia != Convert.ToDateTime(correr));
            return cont-1;
        }

        public override string ToString()
        {
            string curso = "sic:" + sic +
                "idSem:" + idSem +
                "  fechaInicioLect:" + fechaInicioLect +
                "  fechaTermLect:" + fechaTermLect +
                "  modificar:" + modificar +
                "  colocar:" + colocar +
                "  fechaInicioPractica:" + fechaInicioPractica +
                "  fechaPractica:" + fechaPractica +
                "  horas:" + horas +
                "  dias:" + dias +
                "  horasxdia:" + horasxdia +               
                "  insOcular:" + insOcular +
                "  relatores:" + relatores +
                "  supervision50:" + supervision50 + 
                "  encuesta75: " + encuesta75 + 
                "  publicar:" + publicar + 
                "  correrLista:" + correrLista + 
                "  visitaInfraestructura:" + visitaInfraestructura + 
                "  acuerdoOperativo:" + acuerdoOperativo +
                "  f1:" + f1 +
                "  f1C:" + f1C + 
                "  ingresoSence:" + ingresoSence + 
                "  f2:" + f2 +
                "  f2C:" + f2C +
                "  f3:" + f3 +
                "  seguimiento:" + seguimiento +
                "  ingSeguimiento1:" + ingSeguimiento1 +
                "  ingSeguimiento2:" + ingSeguimiento2 + 
                "  f4:" + f4 + 
                "  certificado:" + certificado + // ceremonia
                "  entreCertif:" + entreCertif
                ;
            return curso ;
        }

     
    }
}

    